const moment = require('moment')
const { Kind } = require('graphql/language')
const { GraphQLScalarType } = require('graphql')


/**
 *  自定义标量的名称，也就是 name
    自定义标量的简介，也就是 description
    当自定义标量值从客户端传递到服务端时的处理函数，也就是 parseValue
    当自定义标量值从服务端返回到客户端时的处理函数，也就是 serialize
    对于自定义标量在 ast 中的字面量的处理函数，也就是 parseLiteral(这是因为在 ast 中的值总是格式化为字符串)
 */
const customScalarDate = new GraphQLScalarType({
  name: 'Date',
  description: 'Date custom scalar type',
  parseValue: value => moment(value).valueOf(),
  serialize: value => moment(value).format('YYYY-MM-DD HH:mm:ss:SSS'),
  parseLiteral: ast => (ast.kind === Kind.INT)
    ? parseInt(ast.value, 10)
    : null
})

module.exports = { Date: customScalarDate }